// const gulp = require("gulp");
const {src,dest,watch, series, parallel} = require("gulp");

const concat = require("gulp-concat");
const uglify = require("gulp-uglify");
const rename = require("gulp-rename");

const babel = require("gulp-babel");

const connect = require("gulp-connect");
const proxy = require("http-proxy-middleware");

const sass = require("gulp-sass");

// ------------------------

function sayHello(hahah){
    console.log("hello");
    hahah();
} 
//  暴露的入口名
exports.say = sayHello;
//   要暴露的功能
// 在执行时，通过say执行sayHello

// ------------------------

// 源文件夹（开发环境，原料）：src文件夹
// 加工
// 目标文件（运行环境，成品）：dist文件夹

// 文件的拷贝
function copyFileFn(){
    return src(["src/**/*","!src/pass.txt"])
        .pipe(dest("dist"))
        .pipe(connect.reload());  // 文件转存之后，触发connect插件的刷新功能
}
exports.copyFile = copyFileFn;

// ------------------------

// 监听文件的变化，自动执行指定功能
function autoCopyFileFn(){
    watch(["src/index.html"], copyFileFn);
}

exports.autoCopyFile = autoCopyFileFn;

// ------------------------

// 正在准备测试批处理方法
// function fn1(abc){
//     console.log(1);
//     abc();
// }
// function fn2(cb){
//     console.log(2);
//     cb();
// }
// function fn3(a){
//     console.log(3);
//     a();
// }
 
// 批量执行功能
// exports.all = series(fn1,fn2,fn3);       // 同步
// exports.all = parallel(fn1,fn2,fn3);        // 异步

// ------------------------

// ES6编译ES5，合并，转存，压缩，改名，转存 的功能
function fileConcatFn(){
    return src("src/js/*.js")
        .pipe(babel({
            presets: ['@babel/env']
        }))
        .pipe(concat("index.js"))       // 合并
        .pipe(dest("dist/js"))          // 转存
        .pipe(uglify())                 // 压缩
        .pipe(rename("index.min.js"))   // 改名
        .pipe(dest("dist/js"))          // 转存
} 
exports.fc = fileConcatFn;
// 注意：gulp-uglify压缩不支持ES6语法，需要先将ES6转成ES5之后才能压缩

// ------------------------

// 只ES6转ES5功能
function stfFn(){
    return src("src/js/*.js")
    .pipe(babel({
        presets: ['@babel/env']
    }))
    .pipe(dest("dist/js"))
}
exports.stf = stfFn;

// ------------------------

// 开启服务
function serverFn(){
    connect.server({
        port:3333,      // 指定端口
        root:"dist",    // 指定根目录
        livereload:true, // 开启刷新功能
        middleware: function(connect, opt) {
            return [
                proxy.createProxyMiddleware('/api',  {
                    target: 'https://wanandroid.com/wxarticle',    //代理的目标地址
                    changeOrigin:true,
                    pathRewrite:{    //路径重写规则
                        '^/api':''
                    }
                })
            ]
        }
    })
}
exports.server = serverFn;

// ------------------------

// 如果需要自动刷新，需要配合监听功能
// 开启监听，开启服务
// 批处理
exports.autoServer = parallel(serverFn,autoCopyFileFn);

// ------------------------
 

// sass编译css功能
function stcFn(){
    return src("src/sass/*.scss")
    .pipe(sass().on("error",sass.logError))
    .pipe(dest("dist/css"))
}
exports.stc = stcFn;

//-------------------

// sass自动编译css功能
function autoStcFn(cb){
    watch("src/sass/*.scss",stcFn);
    cb();
}
exports.autoStc = autoStcFn;


//------------------------------------

//专为测试模块化案例定义的功能

function scssfn(){
    return src("src/tab+toast/sass/*.scss")
    .pipe(sass())
    .pipe(dest("dist/css"));
}

function copyStaticFn(){
    return src(["src/tab+toast/**/*.js","src/tab+toast/**/*.html"])
    .pipe(sass())
    .pipe(dest("dist/css"));
}

function watch2Fn(){
    watch(["src/tab+toast/sass/*.scss"],scssfn);
    watch(["src/tab+toast/**/*.js","src/tab+toast/**/*.html"],copyStaticFn);
}


exports.w2 = watch2Fn;










// sass编译css功能
function stcFn(){
    return src("youle/*.scss")
    .pipe(sass().on("error",sass.logError))
    .pipe(dest("youle/youlecss"))
}
exports.stc = stcFn;



// sass自动编译邮乐css功能
function autoStcFn(cb){
    watch("youle/*.scss",stcFn);
    cb();
}
exports.autoStc = autoStcFn;

